home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 142_01 / days.c < prev    next >
Text File  |  1985-03-09  |  2KB  |  98 lines

  1.  
  2. /*    days() is hereby placed in the public domain
  3.     Alan Coates 17 JUN 1984
  4.  
  5.     The function accepts a 6 digit ASCII argument ddmmyy
  6.     and returns a (long) number of days from 1.1.1900,
  7.     corrected for leap years up to 31.12.2099
  8.  
  9.  */
  10.  
  11. #include "local.h"    /* from Thomas Plum, or use "libc.h" */
  12.  
  13.  
  14. long days(date)
  15. char date[];
  16. {
  17. int dd,mm,dmax;
  18. long daytot,yy;
  19. char *s;
  20.     dd = mm = yy = 0;
  21.     for(s = date;s < date+2 && isdigit(*s); )
  22.         dd = dd*10 + *(s++) -48;
  23.     for(s = date + 2;s < date+4 && isdigit(*s); )
  24.         mm = mm*10 + *(s++) -48;
  25.     for(s = date + 4 ;s < date+ 6 && isdigit(*s); )
  26.         yy = yy*10 + *(s++) -48;
  27.     daytot = dd;
  28.     /*    add months, correct for time of year    */
  29.     daytot += 30*(mm - 1);
  30.     switch (mm)
  31.             {
  32.  
  33.         case 2:
  34.             if (!((yy-4)%4))
  35.                 dmax = 29;
  36.             else
  37.                 dmax = 28;
  38.             break;
  39.         case 4:
  40.         case 6:
  41.         case 9:
  42.         case 11:
  43.             dmax = 30;
  44.             break;
  45.         default:
  46.             dmax = 31;
  47.             break;
  48.             }
  49.     if (dd <1 || dd > dmax)
  50.         remark("bad day  ",dd);
  51.     switch (mm)
  52.             {
  53.         case 1:
  54.         case 4:
  55.         case 5:
  56.             daytot += 0; /*    no correction    */
  57.             break;
  58.         case 3:
  59.             daytot -= 1;
  60.             break;
  61.         case 2:
  62.         case 6:
  63.         case 7:
  64.             daytot += 1;
  65.             break;
  66.         case 8:
  67.             daytot += 2;
  68.             break;
  69.         case 9:
  70.         case 10:
  71.             daytot += 3;
  72.             break;
  73.         case 11:
  74.         case 12:
  75.             daytot += 4;
  76.             break;
  77.         default:
  78.             remark("Bad month",mm);
  79.             break;
  80.             }
  81.     /*    add for completed years    */
  82.         daytot += 365*yy;
  83.     /*    correct within a leap year iff after Feb 29    */
  84.         if(mm > 2 && yy%4 == 0 && yy > 0)
  85.             daytot += 1;
  86.     /*    correct for elapsed leap years    */
  87.         daytot += (yy-1)/4;
  88.     return(daytot);
  89. }
  90. remark(s1,x)
  91.     char s1[] ;
  92.     int x;
  93.     {
  94.     printf("%s   %d\n",s1,x);
  95.     return;
  96.     }
  97.  
  98.